# encoding=utf-8
import requests
from bs4 import BeautifulSoup
import asyncio
import aiohttp


# 定义函数，用于获取小说章节内容
async def get_chapter_content(session, url):
    # 发送HTTP GET请求，获取小说章节页面内容
    async with session.get(url) as response:
        html = await response.text()
        # 使用BeautifulSoup解析HTML文档
        soup = BeautifulSoup(html, 'html.parser')
        # 查找小说正文内容所在的HTML元素
        content_element = soup.find('div', id = 'content')
        # 获取小说正文内容
        content = content_element.text.strip()
        # 返回小说正文内容
        return content


# 定义函数，用于获取小说章节列表
async def get_chapter_list(session, url):
    # 发送HTTP GET请求，获取小说目录页面内容
    async with session.get(url) as response:
        html = await response.text()
        # 使用BeautifulSoup解析HTML文档
        soup = BeautifulSoup(html, 'html.parser')
        # 查找小说章节列表所在的HTML元素
        chapter_list_element = soup.find('div', id = 'list')
        # 获取所有小说章节链接
        chapter_links = chapter_list_element.find_all('a')
        # 创建任务列表
        tasks = []
        # 遍历所有小说章节链接，并获取小说章节内容
        for chapter_link in chapter_links:
            # 获取小说章节链接
            chapter_url = 'https://www.biquge.com.cn' + chapter_link.get('href')
            # 获取小说章节标题
            chapter_title = chapter_link.text
            # 创建任务，获取小说章节内容
            task = asyncio.create_task(get_chapter_content(session, chapter_url))
            # 将任务添加到任务列表中
            tasks.append(task)
        # 等待所有任务完成
        await asyncio.gather(*tasks)
        # 将小说章节内容保存到本地文件中
        with open('novel.txt', 'a', encoding = 'utf-8') as f:
            for chapter_link, task in zip(chapter_links, tasks):
                chapter_title = chapter_link.text
                content = await task
                f.write(chapter_title + '\n\n' + content + '\n\n')


# 定义主函数
async def main():
    # 设置小说目录页的URL
    url = 'https://www.biquge.com.cn/book/20930/'
    # 创建异步HTTP会话
    async with aiohttp.ClientSession() as session:
        # 获取小说章节列表，并保存小说内容到本地文件中
        await get_chapter_list(session, url)


# 执行主函数
if __name__ == '__main__':
    asyncio.run(main())
